# 回形取数就是沿矩阵的边取数，若当前方向上无数可取或已经取过，则左转90度。一开始位于矩阵左上角，方向向下。
# 输入描述
# 输入第一行是两个不超过 200 的正整数 m,n，表示矩阵的行和列。接下来 m 行每行 几 个整数，表示这个矩阵。
# 输出描述
# 输出只有一行，共 mn 个数，为输入矩阵回形取数得到的结果。数之间用一个空格分隔，行末不要有多余的空格
# 输入
# 3 3
# 1 2 3
# 4 5 6
# 7 8 9
# 输出
# 1 4 7 8 9 6 3 2 5

# 通过x表示纵坐标,因为x表示行数,行数+1时纵坐标就会加一 同理 y表示横坐标
if __name__ == '__main__':
    n, m = map(int, input().split())
    tmp = []  # 存放答案
    vis = [[0 for i in range(m)] for i in range(n)]  # 验证位置是否走过 当vis[x][y] = 1时即为走过
    arr = [list(map(int, input().split())) for _ in range(n)]
    # 注意: 向下为x, 向右为y
    x = 0  # 当前纵坐标
    y = 0  # 当前横坐标
    while len(tmp) < n * m:
        while x < n and vis[x][y] == 0:
            tmp.append(arr[x][y])
            vis[x][y] = 1
            x += 1  # 纵坐标加一
        x -= 1  # 将上步多余的步数删除,防止溢出
        y += 1  # 将横坐标右移
        while y < m and vis[x][y] == 0:
            tmp.append(arr[x][y])
            vis[x][y] = 1
            y += 1
        x -= 1  # 将纵坐标减一
        y -= 1  # 将上步多余步数删除,防止溢出
        while x >= 0 and vis[x][y] == 0:
            tmp.append(arr[x][y])
            vis[x][y] = 1
            x -= 1  # 将纵坐标上移
        x += 1  # 将上步多余步数删除,防止溢出
        y -= 1  # 将横坐标左移
        while y >= 0 and vis[x][y] == 0:
            tmp.append(arr[x][y])
            vis[x][y] = 1
            y -= 1  # 将横坐标左移
        y += 1  # 将上步多余步数删除
        x += 1  # 将纵坐标下移

    # 输出数据
    for i in range(len(tmp)):
        print(tmp[i], end=' ')
